package com.winbomb.kingcard;

import java.util.List;

public interface IPlayer {

	/**
	 * 是人还是电脑
	 * 
	 * @return 是人返回true
	 */
	public boolean isHuman();

	/***** 下面是关于玩家手中牌操作的方法定义 */

	/**
	 * 获取游戏者手中的牌
	 * 
	 * @return
	 */
	public ICard[] getCards();

	/**
	 * 获取游戏者手中牌的数量
	 * 
	 * @return
	 */
	public int getCardCount();

	/**
	 * 获得玩家的战牌
	 * 
	 * 所谓战牌,与手牌对应,指的是玩家拿出去进行战斗的牌
	 * 
	 * @return
	 */
	public List<ICard> getBattleCards();

	/**
	 * 从抽牌堆起牌
	 * 
	 * @param cardPile
	 */
	public void drawCard();

	/**
	 * 选中某一张牌
	 * 
	 * @param index
	 *            牌在手牌中的编号
	 */
	public void selectCard(int index);

	/**
	 * 放弃选择的牌
	 * 
	 * @param index
	 */
	public void deselectCard(int index);

	/**
	 * 获得已经选择的牌
	 * 
	 * @return
	 */
	public ICard[] getSelectedCards();

	/**
	 * 获得已经选择的牌
	 * 
	 * 与get的区别在于，take会在player的牌中删去选择的牌，而get不会。
	 * 
	 * @return
	 */
	public ICard[] takeSelectedCards();

	/**
	 * 获得已选择牌的数量
	 * 
	 */
	public int getSelectedCardCount();

	/**
	 * 出牌
	 */
	public ICard[] playCards();

	/**
	 * 回合结束后收回扑克
	 */
	public void takeback(ICard[] cards);

	/**
	 * 收回扑克
	 * 
	 * @param card
	 */
	public void takeback(ICard card);

	/**
	 * 换牌
	 */
	public void changeCard();

	/**
	 * 玩家是否还健在
	 */
	public boolean isAlive();

	/**
	 * 是否是胜利者
	 * 
	 * @return
	 */
	public boolean isVictorior();

	/**
	 * 势力重新复活
	 * 
	 * @param master
	 *            主公
	 * @param sendCards
	 *            复活的牌
	 */
	public void revitalize(IPlayer master, ICard[] sendCards);

	/**
	 * 独立
	 */
	public void independ();

	/**
	 * 获取自己在player中的坐标
	 * 
	 * @return
	 */
	public int getPlayerIndex();

	public void setPlayerIndex(int index);

	/**
	 * 获得该玩家本轮进行的动作，是出征、修养还是策略
	 * 
	 * @return
	 */
	public Action getAction();

	/**
	 * 设置该玩家本轮进行的动作，是出征、修养还是策略
	 * 
	 * @return
	 */
	public void setAction(Action action);

	/**
	 * 是否是攻击者
	 * 
	 * @return
	 */
	public boolean isAttacker();

	/**
	 * 设置攻击的对象
	 * 
	 */
	public void setAttackTarget(IPlayer player);

	/**
	 * 获取攻击的对象
	 * 
	 */
	public IPlayer getAttackTarget();

	/**
	 * 是否是防御者
	 * 
	 * @return
	 */
	public boolean isDefender();

	/**
	 * 设置进攻的发起者
	 * 
	 * @param player
	 */
	public void setAttackSource(IPlayer player);

	/**
	 * 获取进攻的发起者
	 * 
	 * @param player
	 */
	public IPlayer getAttackSource();

	/**
	 * 获得进攻路线
	 * 
	 * @return
	 */
	public IAttackRoute getAttackRoute();

	/**
	 * 玩家名称
	 */
	public String getPlayerName();

	/**
	 * 获得玩家信息，包括姓名，位置等。
	 * 
	 * @return
	 */
	public IPlayerInfo getPlayerInfo();

	/**
	 * 获得主公
	 * 
	 * 如果本方势力消亡，后来又被别人复立。则本方势力依附于别人，这个人即为master。
	 * 
	 * @return
	 */
	public IPlayer getMaster();

	/**
	 * 获得所属势力
	 * 
	 * @return
	 */
	public IForce getForce();

	/**
	 * 势力消减
	 */
	public void clearForce();

	/**
	 * 被人击败
	 */
	public void defeated();

	/**
	 * 置空，当新一轮开始的时候，需要置空。
	 */
	public void reset();

	/**
	 * 获得玩家左手边的玩家
	 * 
	 * @return
	 */
	public IPlayer getLeftPlayer();

	/**
	 * 获得左手边还存活的玩家
	 */
	public IPlayer getLeftAlivePlayer();

	/**
	 * 获得玩家右手边的玩家
	 */
	public IPlayer getRightPlayer();

	/**
	 * 获得右手边还存活的玩家
	 */
	public IPlayer getRightAlivePlayer();

	/**
	 * 处理游戏中的动作，例如出牌、选择攻击目标，选择丢弃的牌等。
	 * 
	 * 主要用于电脑玩家的动作，人工玩家这些动作是通过手动操作完成的。
	 */
	public void handle();

	/**
	 * 
	 * 获得玩家本回合能否进行下列动作, true表示可以, false表示不行
	 * 
	 * 0 : 能否出征
	 * 
	 * 1 : 能否修养
	 * 
	 * 2 : 能否派遣
	 * 
	 * 3 : 能否征召
	 * 
	 * 4 : 能否独立
	 * 
	 * @return
	 */
	public boolean[] getActionMask();

	/**
	 * 轮到本人的步骤是否完成
	 * 
	 * @return
	 */
	public boolean isDone();

	public void setDone(boolean isDone);

	/**
	 * 获取本回合出手的剩余时间
	 */
	public float getTimeLeft();

	public void setTimeLeft(float timeLeft);

	public void elapse(float dt);

	/**
	 * 撤兵
	 */
	public void withdraw();

	/**
	 * 获得统计信息
	 * 
	 * @return
	 */
	public IStatsInfo getStatsInfo();

	/**
	 * 设置派遣的目标
	 * 
	 * @param target
	 */
	public void setSendTarget(IPlayer target);

	/**
	 * 获取派遣的目标
	 * 
	 * @return
	 */
	public IPlayer getSendTarget();

	/**
	 * 设置征召的源
	 * 
	 * @param source
	 */
	public void setCallSource(IPlayer source);

	/**
	 * 获取征召的源
	 * 
	 * @return
	 */
	public IPlayer getCallSource();

	/**
	 * 设置是否托管
	 * 
	 * @param isMandate
	 */
	public void setMandate(boolean isMandate);

}
